package com.auntvt.timo.jpax.core.service.impl;

import com.auntvt.timo.jpax.core.quick.interfaces.QuickSpecification;
import com.auntvt.timo.jpax.core.service.QuickService;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;

import java.util.List;
import java.util.Optional;

/**
 * 特殊接口，用于实现QuickService"多继承"
 * <p>QuickService接口实现，对应JpaSpecificationExecutor接口的方法</p>
 *
 * @author 小懒虫 <auntvt@163.com>
 * @date 2021/7/31
 */
public interface QuickServiceMulti<T> extends QuickService<T> {

    /**
     * 获取对应实体类的持久层Repository接口
     *
     * @return Repository接口
     */
    JpaSpecificationExecutor<T> getRepository();

    /**
     * 根据Quick查询实例条件获取数据
     *
     * @param quickSpecification Quick查询实例
     * @return 实体类对象
     */
    @Override
    default T get(QuickSpecification<T> quickSpecification) {
        return getRepository().findOne(quickSpecification).orElse(null);
    }

    /**
     * 根据Quick查询实例条件获取数据
     *
     * @param quickSpecification Quick查询实例
     * @return Optional对象
     */
    @Override
    default Optional<T> getOptional(QuickSpecification<T> quickSpecification) {
        return getRepository().findOne(quickSpecification);
    }

    /**
     * 根据Quick查询实例条件获取数据
     *
     * @param quickSpecification Quick查询实例
     * @return 列表数据
     */
    @Override
    default List<T> lists(QuickSpecification<T> quickSpecification) {
        return getRepository().findAll(quickSpecification);
    }

    /**
     * 根据Quick查询实例条件获取数据，，并且进行排序
     *
     * @param quickSpecification Quick查询实例
     * @param sort               排序对象
     * @return 列表数据
     */
    @Override
    default List<T> lists(QuickSpecification<T> quickSpecification, Sort sort) {
        return getRepository().findAll(quickSpecification, sort);
    }

    /**
     * 根据Quick查询实例条件获取数据，并且进行分页
     *
     * @param quickSpecification Quick查询实例
     * @param pageable           分页配置对象
     * @return 分页数据
     */
    @Override
    default Page<T> pages(QuickSpecification<T> quickSpecification, Pageable pageable) {
        return getRepository().findAll(quickSpecification, pageable);
    }

    /**
     * 根据Quick查询实例条件统计个数
     *
     * @param quickSpecification Quick查询实例
     * @return 数量
     */
    @Override
    default long count(QuickSpecification<T> quickSpecification) {
        return getRepository().count(quickSpecification);
    }
}
